#!/usr/bin/env python
# -*- coding: utf-8; indent-tabs-mode:nil; tab-width:4 -*-

# This file is part of DITA DTD Generator.
#
# DITA DTD Generator is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# DITA DTD Generator is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with DITA DTD Generator.  If not, see <http://www.gnu.org/licenses/>.

import sys
#import httplib
#import cgi
import cgitb; cgitb.enable()
#import urlparse
#import urllib
#import xml.dom.minidom
#import sys
#import os
#import re
#import time
#import stat
#import datetime
#import dita
#from HTMLParser import HTMLParser
#from htmldom import DOMHTMLParser
#import tempfile
#import tarfile
import ditagen.dtdgen
import ditagen.dita.v1_1
import ditagen.dita.v1_2
import ditagen.generator

DOMAIN_MAP = {
    "1.1": {
        "ui": ditagen.dita.v1_1.UiDomain,
        "hi": ditagen.dita.v1_1.HiDomain,
        "pr": ditagen.dita.v1_1.PrDomain,
        "sw": ditagen.dita.v1_1.SwDomain,
        "ut": ditagen.dita.v1_1.UtDomain,
        "indexing": ditagen.dita.v1_1.IndexingDomain,
        "mapgroup": ditagen.dita.v1_1.MapGroupDomain,
        "abbreviated": ditagen.dita.v1_1.AbbreviatedFormDomain,
        "xnal": ditagen.dita.v1_1.XNALDomain,
        },
    "1.2": {
        "ui": ditagen.dita.v1_2.UiDomain,
        "hi": ditagen.dita.v1_2.HiDomain,
        "pr": ditagen.dita.v1_2.PrDomain,
        "sw": ditagen.dita.v1_2.SwDomain,
        "ut": ditagen.dita.v1_2.UtDomain,
        "indexing": ditagen.dita.v1_2.IndexingDomain,
        "learning": ditagen.dita.v1_2.LearningDomain,
        "learningmeta": ditagen.dita.v1_2.LearningMetaDomain,
        "learningmap": ditagen.dita.v1_2.LearningMapDomain,
        "mitask": ditagen.dita.v1_2.MachineIndustryTaskDomain,
        "hazardstatement": ditagen.dita.v1_2.HazardStatementDomain,
        "mapgroup": ditagen.dita.v1_2.MapGroupDomain,
        "abbreviated": ditagen.dita.v1_2.AbbreviatedFormDomain,
        "xnal": ditagen.dita.v1_2.XNALDomain,
        "delay": ditagen.dita.v1_2.UserDelayedResolutionDomain,
        "classify": ditagen.dita.v1_2.ClassifyDomain,
        "taskbody": ditagen.dita.v1_2.MachineIndustryTaskbodyConstraints,
        "strictTaskbody": ditagen.dita.v1_2.StrictTaskbodyConstraints
        }
    }
TOPIC_MAP = {
    "1.1": {
        "concept": ditagen.dita.v1_1.ConceptType,
        "reference": ditagen.dita.v1_1.ReferenceType,
        "task": ditagen.dita.v1_1.TaskType,
        "topic": ditagen.dita.v1_1.TopicType,
        "map": ditagen.dita.v1_1.MapType,
        "bookmap": ditagen.dita.v1_1.BookMapType,
        },
    "1.2": {
        "concept": ditagen.dita.v1_2.ConceptType,
        "reference": ditagen.dita.v1_2.ReferenceType,
        "task": ditagen.dita.v1_2.TaskType,
        "topic": ditagen.dita.v1_2.TopicType,
        "machineTask": ditagen.dita.v1_2.MachineryTaskType,
        "map": ditagen.dita.v1_2.MapType,
        "bookmap": ditagen.dita.v1_2.BookMapType,
        "classifyMap": ditagen.dita.v1_2.ClassificationMapType,
        "subjectScheme": ditagen.dita.v1_2.SubjectSchemeMapType,
        "learningAssessment": ditagen.dita.v1_2.LearningAssessmentType,
        "learningBookmap": ditagen.dita.v1_2.LearningBookMapType,
        "learningContent": ditagen.dita.v1_2.LearningContentType,
        "learningMap": ditagen.dita.v1_2.LearningMapType,
        "learningOverview": ditagen.dita.v1_2.LearningOverviewType,
        "learningPlan": ditagen.dita.v1_2.LearningPlanType,
        "learningSummary": ditagen.dita.v1_2.LearningSummaryType
        }
    }

def print_response_headers(__file_name):
    print u"Status: 200 Ok"
    print u"Content-Type: text/plain; charset=UTF-8"
    # print u"Content-disposition: attachment; file_name=%s.%s" % (__root, __f)
    #print u"Content-disposition: file_name=%s" % __file_name #__dita.getfileName(__type, __root, __f)
    print

def main(form):
    """Main method."""
    __type = None
    __root = None
    __owner = None
    __nested = None
    __remove = {}
    __global_atts = None
    __format = None
    __domains = []
    __types = []
    __version = "1.1"
    __plugin_name = None
    __stylesheet = None
    __title = None
    
    try:
        # read arguments
        #form = cgi.FieldStorage()
        if u"version" in form:
            __version = form.getfirst(u"version")
            if __version not in ("1.1", "1.2"):
                raise ValueError()
        # get domains
        __domains = []
        for __d in form.getlist(u"domain"):
            if __d in DOMAIN_MAP[__version]:
                __domains.append(DOMAIN_MAP[__version][__d]())
        # get type
        __t = form.getfirst(u"type")
        if __t in TOPIC_MAP[__version]:
            __type = TOPIC_MAP[__version][__t]()
        # get arguments
        __root = form.getfirst(u"root")
        __owner = form.getfirst(u"owner")
        __title = form.getfirst(u"title")
        __nested = u"nested" in form
        #__remove = dict([(n, True) for n in form.getlist("remove")])
        #if __root is None or re.match("^\s*$", __root):
        #    __root = __type.get_root().get_name()
    #    if __root == __type.get_root().get_name():
    #        __root = None
        #if __root == None or __root == "":
        #    __root = __type.get_root().get_name()
        #__global_atts = None#form.getfirst(u"attribute")
        __format= form.getfirst(u"file")
        __stylesheet= form.getfirst(u"stylesheet")
        
        if __root is not None:
            if __version == "1.2":
                __st = ditagen.dita.v1_2.SpecializationType
            else:
                __st = ditagen.dita.v1_1.SpecializationType
            if __title:
                __t = __title
            else:
                __t = __root.capitalize()
            __type = __st(__root, __t, __type, __owner, __root)
    except:
        #print u"HTTP/1.1 400 Invalid arguments"
        #print
        raise
        
    # run generator
    if __format== u"plugin":
        __dita_gen = ditagen.generator.PluginGenerator()
        __dita_gen.set_output(sys.stdout)
        __dita_gen.set_topic_type(__type)
        __dita_gen.set_domains(__domains)
        #__dita_gen.set_root(__root)
        #__dita_gen.set_owner(__owner)
        __dita_gen.set_nested(__nested)
        __dita_gen.set_version(__version)
        if __stylesheet:
            __dita_gen.set_stylesheet(__stylesheet)
        __dita_gen.set_plugin_name(__plugin_name)
        
        __file_name = __dita_gen.get_file_name(__type, __root, "zip")
        print u"Status: 200 Ok"
        #print u"Content-type: application/zip"
        print u"Content-disposition: attachment; filename=%s" % __file_name
        print
        
        __dita_gen.generate_plugin()
    else:
        __dita_gen = ditagen.generator.DitaGenerator()
        __dita_gen.set_output(sys.stdout)
        __dita_gen.set_topic_type(__type)
        __dita_gen.set_domains(__domains)
        #__dita_gen.set_root(__root)
        #__dita_gen.set_owner(__owner)
        __dita_gen.set_nested(__nested)
        __dita_gen.set_version(__version)

        __file_name = __dita_gen.get_file_name(__type, __root, __format)
        print_response_headers(__file_name)        
        if __format == u"dtd":
            __dita_gen.generate_dtd()
        elif __format == u"mod":
            #__dita_gen.print_mod(__type, __domains, __root, __owner, __nested, __remove, __global_atts)
            __dita_gen.generate_mod()
        elif __format == u"ent":
            #__dita_gen.print_mod(__type, __domains, __root, __owner, __nested, __remove, __global_atts)
            __dita_gen.generate_ent()
        #elif __format== u"tgz":
        #    __file_name = __dita_gen.get_file_name(__type, __root, "tar.gz")
        #    #print_response_headers(__file_name)
        #    print u"Status: 200 Ok"
        #    print u"Content-Encoding: x-gzip"
        #    print u"Content-type: application/x-tar"
        #    print u"Content-disposition: attachment; filename=%s" % __file_name #getFileName(__type, __root, "tar.gz")
        #    print
        #    __dita_gen.generate_zip(sys.stdout, __type, __domains, __root, __owner, __nested, __remove, __global_atts)
        #elif __format== u"xzip":
        #    __file_name = __dita_gen.get_file_name(__type, __root, "zip")
        #    #print_response_headers(__file_name)
        #    print u"Status: 200 Ok"
        #    #print u"Content-Encoding: x-gzip"
        #    print u"Content-type: application/zip"
        #    print u"Content-disposition: attachment; filename=%s" % __file_name #getFileName(__type, __root, "tar.gz")
        #    print
        #    zip_dita_gen = ditagen.generator.ZipGenerator(sys.stdout)
        #    zip_dita_gen.generate_zip(sys.stdout, __type, __domains, __root, __owner, __nested)
        #elif __format== u"zip":
        #    __file_name = __dita_gen.get_file_name(__type, __root, "zip")
        #    print u"Status: 200 Ok"
        #    print u"Content-type: application/zip"
        #    print u"Content-disposition: attachment; filename=%s" % __file_name
        #    print
        #    __dita_gen.generate_zip(sys.stdout)

if __name__ == "__main__":
    main()
